package com.rc.saas.tenant.common.component;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.UUID;

/**
 * ID生成器
 * Created by sven on 2019/11/12
 */
@Component
public class UidGenerator {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    //private final String FX_PREFIX = "FX";

    /**
     * 生成结算单号
     */
    public String genBillOrderNum(String tenantCode, Long lastId) {
        //根据产品需求更改:结算订单号改一下规则：JZJS+年月日+6位序号
//        if (StringUtils.isBlank(tenantCode)) {
//            logger.error("生成结算单号时运营商编码为空");
//            return null;
//        }
        // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String timeStamp = dateFormat.format(System.currentTimeMillis());
        //编码规则(29位): 运营商编码(tenantCode)9位 + 时间戳到毫秒17位+uuid后3位
        //String num = tenantCode + timeStamp + StringUtils.right(UUID.randomUUID().toString(), 3);
        String num = "JZJS" + timeStamp + String.format("%06d", lastId);
        return num;
    }
    /**
     * 生成微信转帐订单号
     */
    public String genWxTransferOutTradeNo(String tenantPrefix, String mobile, String transferType) {
        if (StringUtils.isBlank(tenantPrefix) || StringUtils.isBlank(mobile)) {
            return null;
        }

        //使用数字0-9，生成20个code point(维基百科称之为'码位')的随机字符串
        //RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('0', '9').build();
        //String randomNumbers = generator.generate(4);

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timeStamp = dateFormat.format(System.currentTimeMillis());

        //编码规则(30位): 支付方式(2位:W微信支付/A支付宝)+运营商简码(4位) + 用户用户后4位 + 时间戳到毫秒17位+uuid后3位
        String num = transferType + StringUtils.right(tenantPrefix.trim(), 4) + StringUtils.right(mobile.trim(), 4) + timeStamp + StringUtils.right(UUID.randomUUID().toString(), 3);
        return num;
    }

    /**
     * 生成支付宝转帐订单号
     */
    public String genAlipayTransferOutBizNo(String tenantPrefix, String tenantOperatorCode, String transferType) {
        if (StringUtils.isBlank(tenantPrefix) || StringUtils.isBlank(tenantOperatorCode)) {
            return null;
        }

        //使用数字0-9，生成20个code point(维基百科称之为'码位')的随机字符串
        //RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('0', '9').build();
        //String randomNumbers = generator.generate(4);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timeStamp = sdf.format(System.currentTimeMillis());

        //编码规则(30位): 支付方式(2位:W微信支付/A支付宝)+运营商简码(4位) + 用户手机后4位 + 时间戳到毫秒17位+uuid后3位
        String num = transferType + StringUtils.right(tenantPrefix.trim(), 4) + StringUtils.right(tenantOperatorCode.trim(), 4) + timeStamp + StringUtils.right(UUID.randomUUID().toString(), 3);
        return num;
    }

    public String genAlipayTransferOutBizNo(String tenantPrefix, String transferType) {
        if (StringUtils.isBlank(tenantPrefix)) {
            return null;
        }

        //使用数字0-9，生成20个code point(维基百科称之为'码位')的随机字符串
        //RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('0', '9').build();
        //String randomNumbers = generator.generate(4);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timeStamp = sdf.format(System.currentTimeMillis());

        //编码规则(30位): 支付方式(2位:W微信支付/A支付宝)+运营商简码(4位) + 用户手机后4位 + 时间戳到毫秒17位+uuid后3位
        String num = transferType + StringUtils.right(tenantPrefix.trim(), 4) + timeStamp + StringUtils.right(UUID.randomUUID().toString(), 3);
        return num;
    }

    /**
     * 根据桩编号生成逻辑址,两两分开
     */
    public synchronized String genPileRtua(String newPileNo) {
        //逻辑地址：桩编号第2位按1空格分隔，如62 97 44 00 00 71
        StringBuffer pileRtuaSb = new StringBuffer().append(newPileNo.replaceAll("(.{2})", "$0 "));
        return pileRtuaSb.substring(0, pileRtuaSb.length() - 1);
    }

    /**
     * 生成桩/枪编号_12位
     */
    public synchronized String genPileNo12(String tenantPrefix, String provinceId, String oldPileNo,String elecServerDomain) {
        //桩规则12位：4位运营商前缀+省编号前2位+000011
        //枪规则12位：4位运营商前缀+省编号前2位+0000（１＋Ｎ）+1

        //省编号前2位
        provinceId = provinceId.substring(0, provinceId.length() - 4);

        //4位运营商前缀+省编号前2位+6位固定，如629712000011
        if (oldPileNo == null) {
            if (elecServerDomain!=null){
                //鼎充桩编号生成规则（）
                StringBuilder stringBuilder=new StringBuilder(tenantPrefix);
                stringBuilder.replace(0,1,"0");
                return stringBuilder.toString() + provinceId + "000011";
            } else {
                return tenantPrefix + provinceId + "000011";
            }
        }

        //5位顺序号：取中间6-11位（包括第6位，没有后面一位）
        String lastNo = oldPileNo.substring(6, 11);

        //转为数字
        int no = Integer.valueOf(lastNo);

        //递增1
        no += 1;

        if (no > 99999) {
        }

        String format = String.format("%05d", no);

        if (elecServerDomain!=null){
            //鼎充桩编号生成规则（桩编号第一位是0）
            StringBuilder stringBuilder=new StringBuilder(tenantPrefix);
            stringBuilder.replace(0,1,"0");
            return stringBuilder.toString() + provinceId + format + "1";
        }

        //最后一位固定是1
        return tenantPrefix + provinceId + format + "1";
    }

    /**
     * 生成桩/枪编号_8位
     */
    public synchronized String genPileNo08(String tenantPrefix, String oldPileNo,String elecServerDomain) {
        //桩规则8位：4位运营商前缀+0001
        //枪规则8位：4位运营商前缀+00（１＋Ｎ）+1

        //4位运营商前缀+4位固定，如62970011
        if (oldPileNo == null) {
            if (elecServerDomain!=null){
                //鼎充桩编号生成规则（桩编号第一位是0）
                StringBuilder stringBuilder=new StringBuilder(tenantPrefix);
                stringBuilder.replace(0,1,"0");
                return stringBuilder.toString() + "0001";
            } else {
                return tenantPrefix + "0001";
            }
        }

        //3位顺序号：取中间4-7位（包括第4位，没有后面一位）
        String lastNo = oldPileNo.substring(4, 7);

        //转为数字
        int no = Integer.valueOf(lastNo);

        //递增1
        no += 1;

        if (no > 999) {
            logger.error("桩编号达到上限999,创建失败,对应运营商:{}", tenantPrefix);
        }

        String format = String.format("%03d", no);

        //最后一位固定是1
        if (elecServerDomain!=null){
            //鼎充桩编号生成规则（桩编号第一位是0）
            StringBuilder stringBuilder=new StringBuilder(tenantPrefix);
            stringBuilder.replace(0,1,"0");
            return stringBuilder.toString() +format + "1";
        }
        return tenantPrefix + format + "1";
    }

    /**
     * 生成短信验证码
     *
     * @return
     */
    public synchronized String genSmsAuthCode() {
        String code = "" + (100000 + new SecureRandom().nextInt(899999));
        return code;
    }

    /**
     * 生成默认的分销商号码
     */
    //public synchronized String genDefaultTenantOperatorCode(String tenantPrefix) {
    //    if (StringUtils.isBlank(tenantPrefix)) {
    //        return null;
    //    }
    //
    //    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
    //    String timeStamp = dateFormat.format(System.currentTimeMillis());
    //
    //    //编码规则(18位): FX+运营商简码(4位) + 时间戳到毫秒12位
    //    String num = FX_PREFIX + tenantPrefix + StringUtils.right(tenantPrefix.trim(), 4) + timeStamp;
    //    return num;
    //}

    public static void main(String[] args) {
        UidGenerator uidGenerator = new UidGenerator();
        //String s = uidGenerator.genPileNo08("6255", "62550051",null);
        //System.out.println(s);
        //System.out.println(uidGenerator.genPileRtua(s));
        //String pileNo="19005801";
        //String first=pileNo.substring(0,1);
        //System.out.println("first:"+first);
        //StringBuilder stringBuilder=new StringBuilder(pileNo);
        //stringBuilder.replace(0,1,"0");
        //System.out.println("stringBuild:"+stringBuilder.toString());
        String pileNo=uidGenerator.genPileNo12("1900","440000",null,"DC_DOMAIN");
        System.out.println("pileNo:"+pileNo);
    }
}
